﻿
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

// Questo serve per usare XElement
using System.Xml.Linq;

/* Autore: Vitali Federico
 * Led Application
 * Data inizio: 09/12/2010
 * Data fine:
 * 
 */
namespace Led_Application
{
    /// <summary>
    /// Logica di interazione per MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        int Valore = 0;
        string name_file;
        public MainWindow()
        {
            InitializeComponent();
        }

        // Un metodo solo per la gestione di tutti i Rectangle
        private void ledClick(object sender, MouseButtonEventArgs e)
        {
            // La prima cosa da fare è ricavare il Rectangle che è stato cliccato
            Rectangle r = sender as Rectangle;

            // Se r è diverso da null, significa che il rectangle è valido... possiamo usarlo
            if (r != null)
            {
                // Tag contine il peso del bit... 1, 2, 4, 8 etc (vedi XAML)
                int peso = Convert.ToInt32(r.Tag);

                // Se il Rectangle è grigio, allora è spento...
                if (r.Fill == Brushes.White)
                {
                    // Lo accendiamo
                    r.Fill = Brushes.Lime;
                    r.Stroke = Brushes.LimeGreen;

                    // Aggiungiamo al valore il giusto peso.
                    Valore += peso;

                    // Beep!
                    Console.Beep(1500, 100);
                }
                else
                {
                    // Se non era grigio allora era acceso e noi lo spegniamo...
                    r.Fill = Brushes.White;
                    r.Stroke = Brushes.Gray;

                    // il peso questa volta va tolto a Valore.
                    Valore -= peso;

                    // Boop!
                    Console.Beep(500, 100);
                }
            }

            // Aggiorno la textblok che mi visualizza il valore.
            txtVal.Text = "Valore : " + Valore.ToString();
            // Aggiorno la textblok che mi visualizza il valore in esadecimale
            txtValEx.Text = "Valore esadecimale : " + Convert.ToString(Valore, 16);
        }

        private void btnAdd_Click(object sender, RoutedEventArgs e)
        {
            lstComandi.Items.Add(Convert.ToInt32(Valore) + "  " + Convert.ToString(Valore, 16));
        }

        private void btnSave_Click(object sender, RoutedEventArgs e)
        {
            // Lo strumento base per leggere e scrivere file XML è XElement
            // nota: Per usare XElement bisogna fare using System.Xml.Linq in cima al sorgente
            try
            {
                if (name_file != "")
                {
                    XElement dati = XElement.Load(name_file);

                    // Aggiungiamo elementi interni
                    dati.Add(new XElement("passo", Convert.ToString(Valore, 16)));

                    // Lo salviamo
                    dati.Save(name_file);
                }
                else
                {
                    XElement file = XElement.Load("Dati.xml");

                    // Aggiungiamo elementi interni
                    file.Add(new XElement("passo", Convert.ToString(Valore, 16)));

                    // Lo salviamo
                    file.Save("Dati.Xml");
                }
            }

            catch
            {
                // Creiamo un oggetto XElement dandogli il nome "sequenza"
                XElement xml = new XElement("sequenza");

                // Aggiungiamo due elementi interni
                xml.Add(new XElement("passo", Valore));
                // xml.Add(new XElement("passo", Convert.ToString(Valore, 16)));

                // Via sul disco!
                xml.Save("Dati.xml");
            }

            // Ora dai una occhiata al file Dati.xml che è stato appena creato nella directory bin\debug del progetto!
            
            // è fatto così
            
            // <?xml version="1.0" encoding="utf-8"?>
            // <sequenza>
            //  <passo>1</passo>
            //  <passo>2</passo>
            // </sequenza>

        }
        private void btnLoad_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                Microsoft.Win32.OpenFileDialog fd = new Microsoft.Win32.OpenFileDialog();

                if (fd.ShowDialog() == true)
                {
                    name_file = fd.FileName;
                    // leggo il file
                    XElement datiLetti = XElement.Load(fd.FileName);

                    // Cancello tutti gli item nella ListBox
                    lstComandi.Items.Clear();

                    // Percorro tutti gli elementi "passo" presenti nel file
                    foreach (XElement p in datiLetti.Elements("passo"))
                    {
                        // Ogni passo trovato finisce nella variabile p

                        // Per accedere al suo contenuto devo utilizzare la proprietà Value
                        lstComandi.Items.Add(p.Value);
                    }
                }            
            }
            catch { }
        }

        private void btnSaveAs_Click(object sender, RoutedEventArgs e)
        {
            // Istanzio un oggetto OpenFileDialog
            Microsoft.Win32.SaveFileDialog fd = new Microsoft.Win32.SaveFileDialog();

            // Lo apro e verifico che torni true (true significa che l'utente ha scelto correttamente un file... non ha per esempio premuto ESC etc )
            if (fd.ShowDialog() == true)
            {
                // Creiamo un oggetto XElement dandogli il nome "sequenza"
                XElement dati = XElement.Load("Dati.xml");

                // Via sul disco con il nome scelto dall'utente
                dati.Save(fd.FileName);
            }
        }

        private void btnArray_Click(object sender, RoutedEventArgs e)
        {
            // Istanzio una form Array
            Array a = new Array();

            // La visualizzo in modalita "Modale"
            a.ShowDialog();
        }
    }
}
